Guice (গুইস) একটি Dependency Injection (DI) ফ্রেমওয়ার্ক যা Java অ্যাপ্লিকেশনে ডিপেন্ডেন্সি ম্যানেজমেন্ট সহজ করে। Guice বিভিন্ন ধরনের Binding প্রদান করে, যার মাধ্যমে আপনি ক্লাসের ডিপেন্ডেন্সিগুলো ইনজেক্ট করতে পারেন। নিচে তিনটি গুরুত্বপূর্ণ binding প্রকার — Constructor Binding, Linked Binding, এবং Instance Binding — বিস্তারিতভাবে আলোচনা করা হলো।
1. Constructor Binding
Constructor Binding হল Guice-এর একটি পদ্ধতি যার মাধ্যমে আপনি একটি ক্লাসের কন্সট্রাক্টরে ডিপেন্ডেন্সি ইনজেক্ট করতে পারেন। Guice নিশ্চিত করে যে কন্সট্রাক্টরের সমস্ত প্যারামিটার সঠিকভাবে ইনজেক্ট করা হয়েছে এবং সেই কন্সট্রাক্টরটি ব্যবহার করে ক্লাসের একটি ইনস্ট্যান্স তৈরি হবে।
যেভাবে কাজ করে:
- যখন আপনি একটি ক্লাসের ডিপেন্ডেন্সি Inject করতে চান, তখন Guice ঐ ক্লাসের কন্সট্রাক্টরের প্যারামিটারগুলোর জন্য বাইন্ডিং কনফিগারেশন সরবরাহ করে।
- Guice তখন ঐ কন্সট্রাক্টরের প্যারামিটারগুলো ডাইনামিকভাবে ইনজেক্ট করে।
উদাহরণ:
// Service Interface
public interface PaymentService {
void processPayment(String amount);
}
// Implementation
public class CreditCardPaymentService implements PaymentService {
private final String gateway;
// Constructor Injection
public CreditCardPaymentService(String gateway) {
this.gateway = gateway;
}
@Override
public void processPayment(String amount) {
System.out.println("Processing payment of " + amount + " via " + gateway);
}
}
// Guice Module for Constructor Binding
import com.google.inject.AbstractModule;
public class PaymentModule extends AbstractModule {
@Override
protected void configure() {
bind(PaymentService.class)
.to(CreditCardPaymentService.class)
.constructor(String.class); // Binding constructor with String parameter
}
}
// Application
import com.google.inject.Guice;
import com.google.inject.Injector;
public class Application {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new PaymentModule());
PaymentService paymentService = injector.getInstance(PaymentService.class);
paymentService.processPayment("100 USD");
}
}
এই উদাহরণে, CreditCardPaymentService ক্লাসে কন্সট্রাক্টর ইনজেকশন করা হয়েছে এবং String টাইপের প্যারামিটার ইনজেক্ট করার জন্য Guice-কে বলা হয়েছে।
2. Linked Binding
Linked Binding হল Guice-এর আরেকটি পদ্ধতি, যেখানে আপনি একটি ইন্টারফেস বা সুপার ক্লাসকে অন্য কোনো ক্লাসের সাথে সংযুক্ত করেন। এটি আপনাকে একটি ইন্টারফেসের জন্য অনেকগুলো বাস্তবায়ন বা কাস্টম ক্লাস সংজ্ঞায়িত করতে সাহায্য করে।
যেভাবে কাজ করে:
- এই পদ্ধতিতে আপনি একটি ইন্টারফেসকে একটি নির্দিষ্ট ক্লাসের সাথে লিঙ্ক বা বাইন্ড করেন, যেখানে নির্দিষ্ট ক্লাসটি ঐ ইন্টারফেসের জন্য বাস্তবায়ন হিসেবে কাজ করবে।
উদাহরণ:
// Interface
public interface PaymentService {
void processPayment(String amount);
}
// Concrete Implementation
public class CreditCardPaymentService implements PaymentService {
@Override
public void processPayment(String amount) {
System.out.println("Processing credit card payment of: " + amount);
}
}
// Another Implementation
public class PayPalPaymentService implements PaymentService {
@Override
public void processPayment(String amount) {
System.out.println("Processing PayPal payment of: " + amount);
}
}
// Guice Module for Linked Binding
import com.google.inject.AbstractModule;
public class PaymentModule extends AbstractModule {
@Override
protected void configure() {
bind(PaymentService.class)
.to(CreditCardPaymentService.class); // Linked Binding to CreditCardPaymentService
}
}
// Application
import com.google.inject.Guice;
import com.google.inject.Injector;
public class Application {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new PaymentModule());
PaymentService paymentService = injector.getInstance(PaymentService.class);
paymentService.processPayment("100 USD");
}
}
এখানে, PaymentService ইন্টারফেসটি CreditCardPaymentService ক্লাসের সাথে লিঙ্ক বা বাইন্ড করা হয়েছে। যদি আমরা এই লিঙ্কিং পরিবর্তন করতে চাই, তাহলে সহজেই to(PayPalPaymentService.class) সেট করতে পারি।
3. Instance Binding
Instance Binding হল Guice-এর আরেকটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা কোনো নির্দিষ্ট ইনস্ট্যান্সকে বাইন্ড করে। এই পদ্ধতিতে, আপনি একেবারে একটি নির্দিষ্ট অবজেক্ট বা ইনস্ট্যান্স ক্লাসের বাইন্ডিং করে দেন, যার মাধ্যমে Guice ঐ ইনস্ট্যান্সটিকে বিভিন্ন ক্লাসে ইনজেক্ট করবে।
যেভাবে কাজ করে:
- এখানে আপনি সরাসরি একটি নির্দিষ্ট অবজেক্টের ইনস্ট্যান্স Guice-কে প্রদান করেন, যার মাধ্যমে ঐ অবজেক্টটি সব জায়গায় ব্যবহার করা যায়।
উদাহরণ:
// Service Interface
public interface PaymentService {
void processPayment(String amount);
}
// Concrete Implementation
public class CreditCardPaymentService implements PaymentService {
@Override
public void processPayment(String amount) {
System.out.println("Processing payment of: " + amount);
}
}
// Guice Module for Instance Binding
import com.google.inject.AbstractModule;
public class PaymentModule extends AbstractModule {
@Override
protected void configure() {
// Providing a specific instance for PaymentService
bind(PaymentService.class).toInstance(new CreditCardPaymentService());
}
}
// Application
import com.google.inject.Guice;
import com.google.inject.Injector;
public class Application {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new PaymentModule());
PaymentService paymentService = injector.getInstance(PaymentService.class);
paymentService.processPayment("200 USD");
}
}
এখানে, PaymentService এর জন্য আমরা সরাসরি CreditCardPaymentService এর একটি নির্দিষ্ট ইনস্ট্যান্স বাইন্ড করেছি। যখন PaymentService ইনজেক্ট করা হবে, তখন Guice এটি সেই ইনস্ট্যান্সটি সরবরাহ করবে।
সারাংশ:
- Constructor Binding: ডিপেন্ডেন্সিগুলি কন্সট্রাক্টর মাধ্যমে ইনজেক্ট করা হয়।
- Linked Binding: একটি ইন্টারফেস বা সুপার ক্লাসকে নির্দিষ্ট ক্লাসের সাথে লিঙ্ক করা হয়।
- Instance Binding: নির্দিষ্ট একটি ইনস্ট্যান্সকে বাইন্ড করা হয়, যাতে ঐ ইনস্ট্যান্সটি সব জায়গায় ব্যবহার করা যায়।
এই তিনটি Binding পদ্ধতির মাধ্যমে আপনি Guice ফ্রেমওয়ার্কে ডিপেন্ডেন্সি ইনজেকশন খুব সহজে পরিচালনা করতে পারবেন, যা আপনার কোডকে আরো মডুলার এবং রক্ষণাবেক্ষণযোগ্য করে তোলে।
Read more